package tier1;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

import javax.swing.BorderFactory;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JRootPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;


import tier2.ServiceGestion;
import tier2.UtilisateurSerialize;
import tier3.CreationCompte;
import tier3.Message;
import tier3.Utilisateur;




public class Client {

	private static   Registry registry;
	protected static  ServiceGestion service;

	private static JPanel conteneurEnvoiMessage=new JPanel();
	private static JPanel conteneurListeAmis=new JPanel();
	private static JPanel ConteneurChat=new JPanel();
	private static JPanel ConteneurLogin=new JPanel();
	private static JTextArea listeAmis = new JTextArea();
	private static JButton boutonEnvoi=new JButton();
	private static JTextArea afficheChat = new JTextArea();
	private static JTextField envoiMessage = new JTextField();
	protected static  Utilisateur userAuthentifier = null;
	protected static JTextField zoneLogin = new JTextField();
	protected static JTextArea zoneMDP = new JTextArea();
	private static JLabel labelLogin=new JLabel();
	private static JLabel labelMDP=new JLabel();
	private static JButton boutonLogin=new JButton();
	private static JButton boutonLogout=new JButton();
	private static JLabel labelUtilisateurAuthentifie=new JLabel();
	private static JMenuBar menubar = new JMenuBar();
	private static JMenu menu = new JMenu();
	private static JMenuItem elementCreeCompte = new JMenuItem();
	private static JMenuItem elementRecuperationMDP = new JMenuItem();
	private static JMenuItem elementAjoutAmi = new JMenuItem();
	private static JMenuItem elementSupprimAmi = new JMenuItem();
	protected static DefaultListModel listModel = new DefaultListModel();
	private static JButton ouvrirConversation=new JButton();
	protected static JList list;
	private static boolean creationCompte=false;
	private static boolean ajoutAmi=false;
	private static boolean recupmdp=false;
	private static boolean supprimAmi=false;
	private static Abonne abonne;
	private static boolean messagePrive=false;

	public static void setAfficheChat(JTextArea afficheChat) {
		Client.afficheChat = afficheChat;
	}

	public static JTextArea getAfficheChat() {
		return afficheChat;
	}

	public static void main(String[] args) throws RemoteException, NotBoundException, InterruptedException  {

		ClientThread c=new ClientThread();
		final Thread t=new Thread(c);
		t.start();

		Abonne nvxUtilisateur=new UtilisateurChat();
	
		Scanner sc = new Scanner(System.in);


		registry = LocateRegistry.getRegistry("localhost",2000);
		service = (ServiceGestion) registry.lookup("ServiceGestion");
		nvxUtilisateur = (Abonne) UnicastRemoteObject.exportObject(new UtilisateurChat(),0);
		abonne=nvxUtilisateur;
		service.abonner(nvxUtilisateur);


		/****************************INTERFACE GRAPHIQUE******************************************/

		JFrame fenetre = new JFrame();
		fenetre.setTitle("Chat");        
		fenetre.setSize(400, 500);
		fenetre.setLocationRelativeTo(null);
		fenetre.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		fenetre.setJMenuBar(menubar);
		menu.setText("Menu");
		menubar.add(menu);
		elementCreeCompte.setText("Créer un compte");
		menu.add(elementCreeCompte);
		elementRecuperationMDP.setText("Mot de passe Oublié");
		menu.add(elementRecuperationMDP);
		elementAjoutAmi.setText("Ajouter un ami");
		menu.add(elementAjoutAmi);
		elementSupprimAmi.setText("Supprimer un ami");
		menu.add(elementSupprimAmi);

		
		
		
		list = new JList(listModel);
		list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
		
		list.setSelectedIndex(0);
		
		list.setPreferredSize(new Dimension(120, 320));
		list.setVisibleRowCount(10);
		list.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		//JScrollPane listScrollPane = new JScrollPane(list);
	
		
		//ouvrirConversation.setText("Dialoguer");
		getConteneurListeAmis().add(list);

		getConteneurListeAmis().setVisible(false);
		//getConteneurListeAmis().add(ouvrirConversation);


		JPanel panel = new JPanel();
		fenetre.add(panel);
		BorderLayout border = new BorderLayout();
		panel.setLayout(border);

		panel.add(conteneurEnvoiMessage,BorderLayout.SOUTH);
		panel.add(getConteneurListeAmis(),BorderLayout.EAST);
		panel.add(ConteneurChat,BorderLayout.WEST);
		panel.add(ConteneurLogin,BorderLayout.NORTH);



		afficheChat.setBackground(Color.WHITE);
		afficheChat.setEditable(false);
		afficheChat.setPreferredSize(new Dimension(250, 320));
		afficheChat.setLineWrap(true);
		afficheChat.setWrapStyleWord(true);
		afficheChat.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		ConteneurChat.add(afficheChat);	
		labelLogin.setText("Login");
		ConteneurLogin.add(labelLogin);
		zoneLogin.setBackground(Color.WHITE);
		zoneLogin.setPreferredSize(new Dimension(80, 20));
		zoneLogin.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		ConteneurLogin.add(zoneLogin);	
		labelMDP.setText("Mot de passe");
		ConteneurLogin.add(labelMDP);
		zoneMDP.setBackground(Color.WHITE);
		zoneMDP.setPreferredSize(new Dimension(80,20));
		zoneMDP.setBorder(BorderFactory.createLineBorder(Color.BLACK));
		ConteneurLogin.add(zoneMDP);			
		boutonLogin.setText("OK");
		boutonLogout.setText("Deconnection");
		ConteneurLogin.add(boutonLogin);	
		ConteneurLogin.add(boutonLogout);
		boutonLogout.setVisible(false);
		ConteneurLogin.add(labelUtilisateurAuthentifie);
		labelUtilisateurAuthentifie.setVisible(false);
		boutonEnvoi.setText("Envoi");			
		envoiMessage.setBackground(Color.WHITE);
		envoiMessage.setPreferredSize(new Dimension(300, 30));
		conteneurEnvoiMessage.add(envoiMessage);
		conteneurEnvoiMessage.add(boutonEnvoi);		
		fenetre.setVisible(true);

		boutonEnvoi.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {		
				try {
					if(ajoutAmi){
						ajoutAmi=false;
						boolean testami=service.demandeAjoutContact(envoiMessage.getText(), userAuthentifier);
						if(!testami){
							afficheChat.append(" Erreur de l'ajout, Utilisateur inexistant ou déjà présent en ami \n");
						}
						else{
							afficheChat.append(" Utilisateur ajoute \n");
						}
					}

					else if(recupmdp){
						recupmdp=false;
						String mdp=service.RecuperationMDP(envoiMessage.getText());
						afficheChat.append("Votre mot de passe est :"+mdp+"\n");
					}
					
					else if(messagePrive){
						messagePrive=false;
						service.EnvoiMessagePrive(envoiMessage.getText(), userAuthentifier.getLogin(), (String) list.getModel().getElementAt(list.getSelectedIndex()));
					}
					
					else if(supprimAmi){
						supprimAmi=false;
						boolean testsupprim=service.SuppressionContact(envoiMessage.getText(), userAuthentifier);
						if(testsupprim){
							afficheChat.append("l'utilisateur a bien été supprimé \n");
						}
						else{
							afficheChat.append("Erreur lors de la suppression \n");
						}
					}


					else if(getUserAuthentifier()!=null){						
						service.EnvoiMessage(envoiMessage.getText(),userAuthentifier.getLogin());
					}
					else{
						afficheChat.append("Veuillez vous identifier avant \n");
					}
					envoiMessage.setText("");
				} catch (RemoteException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}

			}
		});

		boutonLogout.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				try {
					System.out.println(getUserAuthentifier());
					if(getUserAuthentifier()!=null){
						Thread.yield();
						service.Deconnection(getUserAuthentifier());
						setUserAuthentifier(null);
						zoneLogin.setVisible(true);
						zoneMDP.setVisible(true);
						boutonLogin.setVisible(true);
						labelLogin.setVisible(true);
						labelMDP.setVisible(true);
						labelUtilisateurAuthentifie.setVisible(false);	
						boutonLogout.setVisible(false);
						getConteneurListeAmis().setVisible(false);
						afficheChat.setText("");

					}
				} catch (RemoteException e1) {
					// TODO Auto-generated catch block
					e1.printStackTrace();
				}
			}
		});

		boutonLogin.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {


				if(!((zoneLogin.getText().equals("XXXXXXX") ||(zoneMDP.getText().equals("XXXXXXX"))))) {
					try {					
						if(creationCompte){
							creationCompte=false;
							Utilisateur comptePersonnel =service.CreationCompte(zoneLogin.getText(),  zoneMDP.getText());	    
							if(comptePersonnel==null){
								afficheChat.append("Login déjà utilisé, recommencez la manipulation \n");							  
							}
							else{
								afficheChat.append("Compte crée avec succes \n");
								afficheChat.append("Entrez vos identidiant \n");

							}
							zoneLogin.setText("");
							zoneMDP.setText("");

							System.out.println("dac");
						}


						else if(!service.testUtilisateur(zoneLogin.getText())){
							Utilisateur utilisateurAuthantifier=service.Authentification(zoneLogin.getText(),zoneMDP.getText(),abonne );
							if(utilisateurAuthantifier!=null){					
								userAuthentifier=utilisateurAuthantifier;
								labelUtilisateurAuthentifie.setText("Bienvenue "+utilisateurAuthantifier.getLogin());
								zoneLogin.setVisible(false);
								zoneMDP.setVisible(false);
								boutonLogin.setVisible(false);
								labelLogin.setVisible(false);
								labelMDP.setVisible(false);
								labelUtilisateurAuthentifie.setVisible(true);	
								boutonLogout.setVisible(true);
								listModel.removeAllElements();
								listModel.addElement("");
								getConteneurListeAmis().setVisible(true);
								ArrayList<Message> listmsg=service.RecuperationHistorique(userAuthentifier);
								for(Message m : listmsg){
									afficheChat.append(m.getExpediteur()+":"+m.getContenu()+"\n");
								}
							
							}
							else{
								afficheChat.append("Utilisateur inexistant, ou login ou mot de passe erroné \n");
							}
						}

						else{
							afficheChat.append("Utilisateur déjà connecté \n");
						}
					} catch (RemoteException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}

				}
				else{
					afficheChat.append("Entrez des identifiants valable \n");
				}
			}
		});

		elementCreeCompte.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if(userAuthentifier==null){
				creationCompte=true;
				afficheChat.append("Entrez un login et un mot de passe \n");
				zoneLogin.setText("XXXXXXX");
				zoneMDP.setText("XXXXXXX");
				}
				else{
					afficheChat.append("Vous êtes déjà connecté \n");
				}
			}
		});

		elementAjoutAmi.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if(userAuthentifier!=null){
					ajoutAmi=true;
					afficheChat.append("Entrez le nom du contact à ajouter \n");
				}
				else{
					afficheChat.append("Veuillez vous identifier avant \n");
				}
			}
		});

		elementRecuperationMDP.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if(userAuthentifier==null){
					recupmdp=true;
					afficheChat.append("Entrez votre login \n");
				}
				else{
					afficheChat.append("Vous êtes déjà connecté \n");
				}
			}
		});
		
		elementSupprimAmi.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				if(userAuthentifier!=null){
					supprimAmi=true;
					afficheChat.append("Entrez le nom du contact à supprimer \n");
				}
				else{
					afficheChat.append("Veuillez vous identifier avant \n");
				}
			}
		});
		
		list.addMouseListener(new MouseAdapter() {
		    public void mouseClicked(MouseEvent evt) {
		        JList listevnt = (JList)evt.getSource();
		        if (evt.getClickCount() == 2) {
		        	
		        	messagePrive=true;
		     
		        	envoiMessage.setText("<--Message Privée-->");	
		        	
		        }
		    }
		});
		
	
		
		/**********************************************************************/


	


	}



	public static Utilisateur getUserAuthentifier() {
		return userAuthentifier;
	}



	public static void setUserAuthentifier(Utilisateur userAuthentifier) {
		Client.userAuthentifier = userAuthentifier;
	}


	public static JPanel getConteneurListeAmis() {
		return conteneurListeAmis;
	}


	public static void setConteneurListeAmis(JPanel conteneurListeAmis) {
		Client.conteneurListeAmis = conteneurListeAmis;
	}








}



















